#pragma once

// 兼容适配层：将独立分发的 serializer 库映射到 COMPI 的包含路径与命名空间下。
// - 头文件路径保持为 "compi/serialization/serializer.h"，以避免下游代码改动。
// - 命名空间别名 compi::serialization -> ::serializer，使模板与符号保持一致。
// - 若后续独立库引入版本化内联命名空间，可在此统一折叠到 compi::serialization。

#include <serializer/serializer.h>

#include <stlcompat/span.h>

// 将独立库的顶层命名空间以别名暴露到 COMPI 名下
namespace serialization = ::serializer;

namespace compi
{
// ---------------------------------------------------------------------------
// COMPI 的便捷封装：统一字节序策略并简化常见调用
// ---------------------------------------------------------------------------

/**
 * 生成传输默认选项（统一为小端字节序）。
 * 参数: 无
 * 返回值: serializer::default_options，字节序固定为 little_endian；其余容量/深度限制使用库默认值。
 * 异常: 无
 */
inline ::serializer::default_options
make_serializer_options()
{
    return ::serializer::default_options{}.with_byte_order(::serializer::byte_order::little_endian);
}

/**
 * 将对象序列化到 vector_writer（便于零拷贝地获取内部缓冲并立即发送）。
 * 参数:
 *  - value: 要序列化的对象
 *  - options: 序列化选项，默认使用 make_serializer_options()（little_endian）
 * 返回值: serializer::vector_writer，内部持有已填充的字节缓冲区，可通过 data() 取得只读引用
 * 异常: 当底层类型序列化或写入过程失败时抛出相应异常；当 options 字节序为 native 时，底层包装会抛出
 * std::invalid_argument
 */
template <typename T>
inline ::serializer::vector_writer
serialize_to_vector_writer(
    const T & value, const ::serializer::default_options & options = make_serializer_options())
{
    ::serializer::vector_writer writer;
    ::serializer::serialize(writer, value, options);
    return writer;
}

/**
 * 将对象序列化为字节向量（便于作为消息载荷传输）。
 * 参数:
 *  - value: 要序列化的对象
 *  - options: 序列化选项，默认使用 make_serializer_options()（little_endian）
 * 返回值: std::vector<std::byte>，包含完整序列化结果
 * 异常: 当底层类型序列化或写入过程失败时抛出相应异常；当 options 字节序为 native 时，底层包装会抛出
 * std::invalid_argument 说明: 此函数会将内部 writer
 * 的缓冲区复制到返回的向量中，如果希望避免复制，可改用 serialize_to_vector_writer()
 */
template <typename T>
inline std::vector<std::byte>
serialize_to_byte_vector(const T & value,
                         const ::serializer::default_options & options = make_serializer_options())
{
    auto writer = serialize_to_vector_writer(value, options);
    return std::vector<std::byte>(writer.data().begin(), writer.data().end());
}

/**
 * 从字节缓冲反序列化为对象（统一接口）。
 * 支持具有 data()/size() 的字节容器与视图（如 std::vector<std::byte>、std::span<const
 * std::byte>）。 参数:
 *  - bytes: 字节容器或视图（需可提供 data()/size()）
 *  - options: 反序列化选项，默认使用 make_serializer_options()（little_endian）
 * 返回值: 目标类型对象
 * 异常: 当底层类型反序列化或读取过程失败时抛出相应异常；当 options 字节序为 native
 * 时，底层包装会抛出 std::invalid_argument
 */
template <typename T, typename Bytes>
inline T
deserialize(const Bytes & bytes,
            const ::serializer::default_options & options = make_serializer_options())
{
    kp::span<const std::byte> sp(bytes.data(), bytes.size());
    ::serializer::span_reader reader(sp);
    return ::serializer::deserialize<T>(reader, options);
}

} // namespace compi